#ifndef __MVT_INI_CTRL_H__
#define __MVT_INI_CTRL_H__

#include "mvdef.h"

/// 请确保 libmvt_utilities_module_init 被调用后再调用本模块的接口

#define FILEPATH_SIZE_MAX 256  ///< 文件路径最大长度
#define SECTION_SIZE_MAX  64   ///< section 最大长度
#define KEY_SIZE_MAX      128   ///< key 最大长度
#define STR_SIZE_MAX      256  ///< value 最大长度

#define ARRAY_BUFFER(buf) buf, sizeof(buf)

///< value 不支持读取空格
mv_s32_t IniFileReadStr  (mv_v8_t av8_path[FILEPATH_SIZE_MAX], mv_v8_t av8_section[SECTION_SIZE_MAX], mv_v8_t av8_key[KEY_SIZE_MAX], mv_v8_t av8_value[STR_SIZE_MAX], mv_s32_t s32_value_size, mv_v8_t av8_default_val[STR_SIZE_MAX]);
mv_s32_t IniFileWriteStr (mv_v8_t av8_path[FILEPATH_SIZE_MAX], mv_v8_t av8_section[SECTION_SIZE_MAX], mv_v8_t av8_key[KEY_SIZE_MAX], mv_v8_t av8_value[STR_SIZE_MAX]);
mv_s32_t IniFileReadInt  (mv_v8_t av8_path[FILEPATH_SIZE_MAX], mv_v8_t av8_section[SECTION_SIZE_MAX], mv_v8_t av8_key[KEY_SIZE_MAX], mv_s32_t s32_default_val);
mv_s32_t IniFileWriteInt (mv_v8_t av8_path[FILEPATH_SIZE_MAX], mv_v8_t av8_section[SECTION_SIZE_MAX], mv_v8_t av8_key[KEY_SIZE_MAX], mv_s32_t s32_value);
///< value 支持读取空格
mv_s32_t IniFileReadStrEx(mv_v8_t av8_path[FILEPATH_SIZE_MAX], mv_v8_t av8_section[SECTION_SIZE_MAX], mv_v8_t av8_key[KEY_SIZE_MAX], mv_v8_t av8_value[STR_SIZE_MAX], mv_s32_t s32_value_size, mv_v8_t av8_default_val[STR_SIZE_MAX]);

mv_s32_t ini_delete      (mv_v8_t av8_path[FILEPATH_SIZE_MAX], mv_v8_t av8_section[SECTION_SIZE_MAX], mv_v8_t av8_key[KEY_SIZE_MAX]);

#define IniFileDelKey(path, section, key) if(ini_delete(path, section, key) == MV_EC_NOT_FOUND) printf("[file:%s] [section:%s] [key:%s] not found !\n", path, section, key);

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///< 加载文件内容至内存版本 >                                                                                                                                                         ///
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
typedef mv_vptr_t INI_HANDLE;

mv_s32_t IniFileReadStrCache    (INI_HANDLE handle, mv_v8_t av8_section[SECTION_SIZE_MAX], mv_v8_t av8_key[KEY_SIZE_MAX], mv_v8_t av8_value[STR_SIZE_MAX], mv_s32_t s32_value_size, mv_v8_t av8_default_val[STR_SIZE_MAX]);
mv_s32_t IniFileReadStrCacheEx  (INI_HANDLE handle, mv_v8_t av8_section[SECTION_SIZE_MAX], mv_v8_t av8_key[KEY_SIZE_MAX], mv_v8_t av8_value[STR_SIZE_MAX], mv_s32_t s32_value_size, mv_v8_t av8_default_val[STR_SIZE_MAX]);
mv_s32_t IniFileReadIntCache    (INI_HANDLE handle, mv_v8_t av8_section[SECTION_SIZE_MAX], mv_v8_t av8_key[KEY_SIZE_MAX], mv_s32_t s32_default_val);
mv_s32_t IniFileWriteStrToCache (INI_HANDLE handle, mv_v8_t av8_section[SECTION_SIZE_MAX], mv_v8_t av8_key[KEY_SIZE_MAX], mv_v8_t av8_value[STR_SIZE_MAX]);
mv_s32_t IniFileWriteIntToCache (INI_HANDLE handle, mv_v8_t av8_section[SECTION_SIZE_MAX], mv_v8_t av8_key[KEY_SIZE_MAX], mv_s32_t s32_value);
mv_s32_t IniFileDelKeyCache     (INI_HANDLE handle, mv_v8_t av8_section[SECTION_SIZE_MAX], mv_v8_t av8_key[KEY_SIZE_MAX]);

mv_s32_t ini_file_load_to_cache (INI_HANDLE*handle, mv_v8_t av8_path[FILEPATH_SIZE_MAX]);
mv_s32_t ini_file_releae_cache  (INI_HANDLE handle, mv_bool_t sync_to_flash);

#define IniFileLoadToCache(handle, path)  ini_file_load_to_cache(&handle, path);
#define IniFileReleaseCache(handle, sync) ini_file_releae_cache(handle, sync)

#endif